// DataLibrary FunctionPlugin - ProfileData

// 識別子：DL_PRFD
// 内容  ：プロフィールデータ。

//----------------------------------------------------------------------------//
// Plugin
//----------------------------------------------------------------------------//

//-- プラグインの読み込み処理 --//
DL_LoadFunction_ProfileData:
	// ライブラリの読み込み処理を優先度9で起動処理に登録する
	Call DL_RegisterStartup "DL_PRFD_Startup" 9
Return


//-- プラグインの終了処理 --//
DL_UnloadFunction_ProfileData:
	Call DL_PRFD_UnLoadProfileData
	UnSet DL_PRFD_TextWidth
Return


//-- 起動処理 --//
DL_PRFD_Startup:
	// コンフィグを登録する
	If DL_GetOptionValue("ProfileTextTag", 1) Then
		Call DL_CFG_SetConfigData "PRFD1" "PRFD_TAG" "OnOff" 1 _
			"文章特殊効果の設定" _
			"文章中の特殊効果の有無を設定します。;スクロールなどの動作が重い場合は;Offにして下さい。" _
			"DL_PRFD_UnLoadProfileData"
	EndIf
	Call DL_CFG_SetConfigData "PRFD2" "PRFD_CACHE" _
		"InputNum -1 1000 -1 無制限 0 無効" DL_GetOptionValue("ProfileCache", -1) _
		"項目キャッシュ数の設定" _
		"項目データの保持数を設定します。;保持されている項目は;二回目以降の表示が速くなります。"
Return


//----------------------------------------------------------------------------//
// ProfileData
//----------------------------------------------------------------------------//

//-- UnLoadProfileData : 読み込んだプロフィールデータを破棄する --//
DL_PRFD_UnLoadProfileData:
	UnSet DL_PRFD_DataCount
	UnSet DL_PRFD_Name
	UnSet DL_PRFD_Image
	UnSet DL_PRFD_Music
	UnSet DL_PRFD_Data
	UnSet DL_PRFD_Text
Return


//-- LoadProfileData data_id [flag] : プロフィールデータを読み込む --//
DL_PRFD_LoadProfileData:
	Local data_id = Args(1)
	Local data_flag = IIf(IsNumeric(Args(2)), Args(2), DL_GetFlag(data_id, DL_ShowLib))
	Local cache_max = DL_GetConfigValue("PRFD_CACHE", DL_GetOptionValue("ProfileCache", -1))
	
	// 読み込み済みの場合は終了する
	If IsVarDefined(DL_PRFD_Name[data_id]) And (cache_max != 0) Then
		Return
	EndIf
	
	// 読み込んだデータ数をカウントする(変数過多による動作速度低下防止策)
	Incr DL_PRFD_DataCount 1
	If (DL_PRFD_DataCount > cache_max) And (cache_max >= 0) Then
		Call DL_PRFD_UnLoadProfileData
	EndIf
	
	// 文章用のフォントを設定する
	Call DL_PRFD_SetProfileTextFont
	Set DL_PRFD_Text[data_id, 0] 0
	
	// アーカイブファイルである場合はサブルーチンを呼び出す
	If IsVarDefined(DL_ArchiveID[DL_ShowLib]) Then
		Call ("DL_ProfileData_" & data_id) data_id data_flag
		Call DL_PRFD_UnSetOptimize
		Return
	EndIf
	
	// ファイルを検索する
	Local file = DL_SearchFile(data_id & ".txt", DL_FolderPath_Library())
	If file = "" Then
		file = DL_SearchFile(data_id & ".dat", DL_FolderPath_Library())
	EndIf
	
	// ファイルが見つからない場合は終了する
	If file = "" Then
		Set DL_PRFD_Name[data_id] DL_GetLibItemData(DL_ShowLib, DL_ShowID, 1)
		Set DL_PRFD_Text[data_id, 0] 1
		Set DL_PRFD_Text[data_id, 1] "No Data ..."
		Return
	EndIf
	
	// プロフィールデータを読み込む
	Local read_data section flag data mark_pos F
	Open file For 入力 As F
	Do While (EOF(F) = 0)
		read_data = DL_LineRead(F, "$comment$")
		
		If read_data = "$comment$" Then
			Skip  // コメント行をスキップする
		ElseIf DL_IsSectionLine(read_data) Then
			// セクションを設定する
			section = LCase(Mid(read_data, 2, Len(read_data) - 2))
			
			// セクションでの進行度フラグを確認する
			If section Like "*:*" Then
				flag = DL_PRFD_EvalFlag(data_flag, RegExpReplace(section, ".*:\s*(.*?)\s*$", "$1"))
				section = RegExpReplace(section, "^\s*(.*?)\s*:.*", "$1")
			Else
				flag = 1
			EndIf
			Skip
		EndIf
		
		// データでの進行度フラグを確認する
		mark_pos = InStr(read_data, ":")
		If mark_pos > 1 Then
			If Mid(read_data, mark_pos - 1, 1) != "\" Then
				flag = DL_PRFD_EvalFlag(data_flag, RegExpReplace(read_data, "^\s*(.*?)\s*:.*", "$1"))
				read_data = RegExpReplace(read_data, "^.*?:\s*(.*)\s*", "$1")
			EndIf
			data = Eval(`"` & read_data & `"`)
		Else
			data = Eval(`"` & read_data & `"`)
		EndIf
		
		If flag = 0 Then
			Skip  // フラグ条件を満たしていなければスキップする
		ElseIf (section != "profile") And (data = "") Then
			Skip  // Section-Profile以外では空行をスキップする
		EndIf
		
		// プロフィールデータを設定する
		Switch section
		Case "profile"
			If InStr(data, "\[") > 0 Then
				data = Replace(data, "\[", "[")
			EndIf
			If data = "_" Then
				Skip  // 文章が"_"だけの場合は次の行に移る
			EndIf
			Call DL_PRFD_SetProfileText data_id data
		Case "name"
			Set DL_PRFD_Name[data_id] DL_ConvertListData(data, ",")
		Case "image"
			If Not IsVarDefined(DL_PRFD_Image[data_id]) Then
				Set DL_PRFD_Image[data_id] ("(" & data & ")")
			Else
				Set DL_PRFD_Image[data_id] List(DL_PRFD_Image[data_id], "(" & data & ")")
			EndIf
		Case "music"
			Set DL_PRFD_Music[data_id] data
		Case Else
			If section Like "data*" Then
				Set DL_PRFD_Data[data_id, Mid(section, 5)] data
			EndIf
		EndSw
	Loop
	Close F
	Call DL_PRFD_UnSetOptimize
Return


//-- EvalFlag flag flag_data : フラグ指定を評価する --//
DL_PRFD_EvalFlag:
	Local flag = Args(1)
	Local flag_data = Eval("List(" & Args(2) & ")")
	
	// 無条件指定を処理する
	If InStr(flag_data, "*") > 0 Then
		Return 1
	EndIf
	
	// 範囲指定を処理する
	If flag_data Like "*-*" Then
		Local num1 = RegExpReplace(flag_data, "^\s*(.*?)\s*-.*", "$1")
		Local num2 = RegExpReplace(flag_data, "\s*.*?\s*-(.*)$", "$1")
		Return ((flag >= num1) And (flag <= num2))
	EndIf
	
	// 比較指定を処理する
	Switch Left(flag_data, 1)
	Case "!"
		Return (flag != Mid(flag_data, 2))
	Case "<"
		Return (flag <= Mid(flag_data, 2))
	Case ">"
		Return (flag >= Mid(flag_data, 2))
	EndSw
	
	// 直接指定を処理する
Return (LSearch(flag_data, flag) > 0)


//----------------------------------------------------------------------------//
// Interface Subroutine
//----------------------------------------------------------------------------//

//-- DrawImage file x y width heigth [option] : プロフィール用画像を描画する --//
DL_PRFD_DrawImage:
	Local file = Args(1)
	Local px = Args(2)
	Local py = Args(3)
	Local width = Args(4)
	Local height = Args(5)
	Local size_w = width
	Local size_h = height
	Local opt_data0 opt_data1
	Local opt_picture opt_draw0 opt_draw1 opt_filter0 opt_filter1 opt_filter2
	
	// ライブラリ個別設定(画像サイズ)を適用する
	If DL_PRF_Setting[DL_ShowLib, "ImageSize"] != "" Then
		size_w = RegExp(DL_PRF_Setting[DL_ShowLib, "ImageSize"], "\d+")
		size_h = RegExp()
		If size_h = "" Then
			size_h = size_w
		EndIf
	EndIf
	
	// ライブラリ個別設定(画像タイプ)を適用する
	If DL_PRF_Setting[DL_ShowLib, "ImageType"] = 1 Then
		opt_draw0 = "透過"
	EndIf
	
	// ファイル名と個別オプションを分割する
	If file Like "*,*" Then
		opt_data0 = RegExpReplace(file, "^.*?,\s*(.*)", "$1")
		file = RegExpReplace(file, "^\s*(.*?)\s*,.*", "$1")
	EndIf
	
	// 表示する画像がない場合は代わりの画像を表示する
	file = DL_GetPictureFile(file)
	If file = "-.bmp" Then
		file = DL_Image["ProfileNoImage"]
		size_w = 64
		size_h = 64
		opt_data0 = ""
		If file Like "*,*" Then
			opt_data0 = RegExpReplace(file, "^.*?,\s*(.*)", "$1")
			file = RegExpReplace(file, "^\s*(.*?)\s*,.*", "$1")
		EndIf
	EndIf
	
	// 個別オプションを設定する
	If opt_data0 != "" Then
		// サイズ指定と画像オプションを分割する
		If opt_data0 Like "*,*" Then
			opt_data1 = RegExpReplace(opt_data0, ".*?,\s*(.*)", "$1")
			opt_data0 = RegExpReplace(opt_data0, "(.*?),.*", "$1")
		EndIf
		
		// 画像オプションが前に存在する場合は交換する
		If (Not IsNumeric(opt_data0)) And (Not opt_data0 Like "*#[*]#*") Then
			Swap opt_data0 opt_data1
		EndIf
		
		// サイズ指定を適用する
		If opt_data0 != "" Then
			size_w = RegExp(opt_data0, "\d+")
			size_h = RegExp()
			If size_h = "" Then
				size_h = size_w
			EndIf
		EndIf
		
		// 画像オプションを解析する
		If RegExp(opt_data1, "透過|通常|フィルタ") != "" Then
			Local data i j
			For i = 1 To LLength(opt_data1)
				Switch LIndex(opt_data1, i)
				Case "透過"
					opt_draw0 = "透過"
					data = Eval(LIndex(opt_data1, i + 1))
					If DL_IsColorRGB(data) Then
						opt_draw1 = data
						Incr i 1
					EndIf
				Case "通常"
					opt_draw0 = ""
					opt_draw1 = ""
				Case "フィルタ"
					opt_filter0 = "フィルタ"
					opt_filter1 = "50%"
					opt_filter2 = "#000000"
					For j = (i + 1) To (i + 2)
						data = Eval(LIndex(opt_data1, j))
						If RegExp(data, "^\d+\%$") != "" Then
							opt_filter1 = data
							Incr i 1
						ElseIf DL_IsColorRGB(data) Then
							opt_filter2 = data
							Incr i 1
						EndIf
					Next
				Case Else
					opt_picture = opt_picture & " " & LIndex(opt_data1, i)
				EndSw
			Next
			opt_picture = Trim(opt_picture)
		Else
			opt_picture = opt_data1
		EndIf
	EndIf
	
	// 表示位置を設定する
	px = px + (width - size_w) \ 2
	py = py + (height - size_h) \ 2
	
	// 画像を表示する
	PaintPicture file px py size_w size_h Args(6) _
		opt_picture opt_draw0 opt_draw1 opt_filter0 opt_filter1 opt_filter2
Return


//-- GetDataListString data_id list_num : 項目の文字列を返す --//
DL_PRFD_GetDataListString:
	Local data = DL_PRFD_Data[Args(1), Args(2)]
	Local name = DL_PRF_Setting[DL_ShowLib, "DataName" & Args(2)]
	Local sep = DL_GetOptionValue("ProfileSeparator", " / ")
	
	// 個別の項目名を設定する
	If data Like "*,*" Then
		name = RegExpReplace(data, "^(.*?)\s*,.*", "$1")
		data = RegExpReplace(data, ".*,\s*(.*?)$", "$1")
	EndIf
	
	// 項目の状態に合わせて文字列を返す
	If data = "" Then
		Return ""
	ElseIf (name = "") Or (name = "-") Then
		Return data
	EndIf
Return (name & sep & data)


